package com.fulihui.common.util;

import org.apache.commons.lang3.StringUtils;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;

import java.util.Map;
import java.util.Set;

/**
 * jedis操作工具类
 *
 * @author: Levon
 * @date: 2018-06-20 17:08
 */
public class JedisUtil {

    private JedisPool jedisPool;

    public Long incr(String key) {
        try (Jedis jedis = jedisPool.getResource()) {
            return jedis.incr(key);
        }
    }

    /***
     * 计数器
     * @param key key
     * @param time 过期时间 单位秒
     * @return
     */
    public Long incr(String key, int time) {
        try (Jedis jedis = jedisPool.getResource()) {
            long result = jedis.incr(key);
            expire(key, time);
            return result;
        }
    }

    public void set(String key, String value) {
        try (Jedis jedis = jedisPool.getResource()) {
            jedis.set(key, value);
        }
    }

    /***
     *
     * @param key
     * @param value
     * @param time 过期时间 单位秒
     */
    public void set(String key, String value, int time) {
        try (Jedis jedis = jedisPool.getResource()) {
            jedis.set(key, value);
            expire(key, time);
        }
    }


    /**
     * HashGet
     *
     * @param key  键 不能为null
     * @param item 项 不能为null
     * @return 值
     */
    public String hget(String key, String item) {
        try (Jedis jedis = jedisPool.getResource()) {
            return jedis.hget(key, item);
        }
    }

    /**
     * 向一张hash表中放入数据,如果不存在将创建
     *
     * @param key   键
     * @param item  项
     * @param value 值
     * @return true 成功 false失败
     */
    public boolean hset(String key, String item, String value) {
        try (Jedis jedis = jedisPool.getResource()) {
            jedis.hset(key, item, value);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 向一张hash表中放入数据,如果不存在将创建
     *
     * @param key   键
     * @param item  项
     * @param value 值
     * @param time  时间(秒)  注意:如果已存在的hash表有时间,这里将会替换原有的时间
     * @return true 成功 false失败
     */
    public boolean hset(String key, String item, String value, int time) {
        try (Jedis jedis = jedisPool.getResource()) {
            jedis.hset(key, item, value);
            if (time > 0) {
                expire(key, time);
            }
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 删除hash表中的值
     *
     * @param key  键 不能为null
     * @param item 项 可以使多个 不能为null
     */
    public void hdel(String key, String... item) {
        try (Jedis jedis = jedisPool.getResource()) {
            jedis.hdel(key, item);
        }
    }

    /**
     * 判断hash表中是否有该项的值
     *
     * @param key  键 不能为null
     * @param item 项 不能为null
     * @return true 存在 false不存在
     */
    public boolean hHasKey(String key, String item) {
        try (Jedis jedis = jedisPool.getResource()) {
            return jedis.hexists(key, item);
        }
    }


    /**
     * 设置过期时间
     *
     * @param key
     * @param seconds
     * @author ruan 2013-4-11
     */
    public void expire(String key, int seconds) {
        if (seconds <= 0) {
            return;
        }
        try(Jedis jedis = jedisPool.getResource()){
            jedis.expire(key, seconds);
        }
    }



    public String get(String key) {
        try (Jedis jedis = jedisPool.getResource()) {
            String obj = jedis.get(key);
            if (StringUtils.isNotBlank(obj)) {
                return obj;
            }
            return null;
        }
    }

    public void del(String key) {
        try (Jedis jedis = jedisPool.getResource()) {
            jedis.del(key);
        }
    }

    /***
     * 判断redis key是否存在
     * @param key
     * @return
     */
    public boolean exist(String key) {
        try (Jedis jedis = jedisPool.getResource()) {
            return jedis.exists(key);
        }
    }

    public Set<String> keys(String pattern) {
        try (Jedis jedis = jedisPool.getResource()) {
            return jedis.keys(pattern);
        }
    }


    /**
     * 向redis列表中增加
     */
    public void lpush(String key, String... pattern) {
        try (Jedis jedis = jedisPool.getResource()) {
            jedis.lpush(key, pattern);
        }
    }

    /**
     * 向redis列表中取出
     */
    public String lpop(String key) {
        try (Jedis jedis = jedisPool.getResource()) {
            return jedis.lpop(key);
        }
    }

    /**
     * 向redis列表中获取值然后删除值
     */
    public String rpop(String key) {
        try (Jedis jedis = jedisPool.getResource()) {
            return jedis.rpop(key);
        }
    }

    /**
     * 向redis列表中获取值然后删除值,如果为空则阻塞
     */
    public String brpop(String key) {
        try (Jedis jedis = jedisPool.getResource()) {
            //超出20秒返回null
            return jedis.brpop(20, key).get(1);
        }
    }


    /**
     * 获取redis列表的长度
     */
    public Long llen(String key) {
        try (Jedis jedis = jedisPool.getResource()) {
            return jedis.llen(key);
        }
    }

    /**
     * redis减一处理
     */
    public void decr(String key) {
        try (Jedis jedis = jedisPool.getResource()) {
            jedis.decr(key);
        }
    }

    /**
     * 向redis集合中增加
     */
    public void sadd(String key, String pattern) {
        try (Jedis jedis = jedisPool.getResource()) {
            jedis.sadd(key, pattern);
        }
    }

    /**
     * 向redis set 中 删除
     */
    public void srem(String key, String value) {
        try (Jedis jedis = jedisPool.getResource()) {
            jedis.srem(key ,value);
        }
    }

    /**
     * get set 的集合数量
     * @param key
     * @return
     */
    public Long scard(String key){
        try (Jedis jedis = jedisPool.getResource()){
            return jedis.scard(key);
        }
    }

    /**
     * 判断成员元素是否是集合的成员
     *
     * @param key
     * @param pattern
     * @return
     */
    public Boolean sismember(String key, String pattern) {
        try (Jedis jedis = jedisPool.getResource()) {
            return jedis.sismember(key, pattern);
        }
    }

    /**
     * 返回集合中的所有的成员
     *
     * @param key
     * @return
     */
    public Set<String> smembers(String key) {
        try (Jedis jedis = jedisPool.getResource()) {
            return jedis.smembers(key);
        }
    }

    /**
     * 添加
     * @param key
     * @param scoreMembers
     */
    public void zadd(String key, Map<String, Double> scoreMembers) {
        try (Jedis jedis = jedisPool.getResource()) {
            jedis.zadd(key, scoreMembers);
        }
    }

    /**
     * 范围搜索
     * @param key
     * @param min
     * @param max
     * @return
     */
    public Set<String> zrangeByScore(String key, double min, double max) {
        try (Jedis jedis = jedisPool.getResource()) {
            Set<String> value = jedis.zrangeByScore(key, min, max);
            return value;
        }
    }

    /**
     * 删除
     * @param key
     * @param members
     * @return
     */
    public Long zrem(String key, String[] members) {
        try (Jedis jedis = jedisPool.getResource()) {
            Long zrem = jedis.zrem(key, members);
            return zrem;
        }
    }
    public void setJedisPool(JedisPool jedisPool) {
        this.jedisPool = jedisPool;
    }
}
